package com.ruifu.worksheet.controller;

import com.fhzncloud.cloud.common.security.service.CloudUser;
import com.fhzncloud.cloud.common.security.util.SecurityUtils;
import com.ruifu.common.feign.RemoteActService;
import com.ruifu.common.feign.RemoteDocService;
import com.ruifu.common.feign.RemoteWorkSheetService;
import com.ruifu.common.utils.BeanConverter;
import com.ruifu.common.vo.PageResultVO;
import com.ruifu.common.vo.ResultVO;
import com.ruifu.common.vo.actanddoc.Flag;
import com.ruifu.common.vo.actanddoc.ProcessParams;
import com.ruifu.common.vo.worksheet.WsCommonSheet;
import com.ruifu.worksheet.dto.WsCommonRelationSheetDTO;
import com.ruifu.worksheet.service.WsCommonSheetService;
import com.ruifu.worksheet.util.StringUtil;
import com.ruifu.worksheet.vo.WsCommonRelationSheetVO;
import com.ruifu.worksheet.vo.WsCommonSheetVO;
import com.ruifu.worksheet.vo.WsCustomizeTypeVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigInteger;
import java.util.List;


/**
 * @author yuanyundi
 * @date 2020/04/20
 */
@RestController
@CrossOrigin
@Slf4j
@RequestMapping("/wsCommonSheet")
public class WsCommonSheetController {
    @Autowired
    private WsCommonSheetService wsCommonSheetService;

    /**
     * 用于存储登陆人信息
     */
    private CloudUser cloudUser;

    @Autowired
    private RemoteActService remoteActService;

    @Autowired
    private RemoteDocService remoteDocService;

    @Autowired
    private RemoteWorkSheetService remoteWorkSheetService;

    /**
     * 通过url请求方法之前,调用该方法获取登陆人信息
     */
    @ModelAttribute
    public void before() {
        cloudUser = SecurityUtils.getUser();
    }

    /**
     * 工作单列表查询
     *
     * @param pageNum 当前页面
     * @param pageSize 每页大小
     * @param classFlag 查询类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @param wsCommonSheetVO  工作单通用VO
     * @return PageResultVO  查询集合
     */
    @PostMapping(value = "/findPage/{pageNum}/{pageSize}/{classFlag}")
    public PageResultVO findPage(@PathVariable("pageNum") int pageNum,
                                 @PathVariable("pageSize") int pageSize,
                                 @PathVariable("classFlag") int classFlag,
                                 @RequestBody WsCommonSheetVO wsCommonSheetVO){
            //检查当前页码是否合理
            pageNum = (pageNum > 0) ? pageNum : 1;
            //检查每页大小是否合理
            pageSize = (pageSize >= 5) ? pageSize : 5;
            return  wsCommonSheetService.findPage(pageNum, pageSize,classFlag,wsCommonSheetVO,cloudUser);
    }

    /**
     * 变更单类型联动查询
     *
     * @param typeName 工作单类型名称
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @return WsCustomizeTypeVO 变更单类型VO
     */
    @GetMapping(value = "/findWorkSheetType/{typeName}/{classFlag}")
    public WsCustomizeTypeVO findWorkSheetType(
            @PathVariable("typeName") String typeName,
            @PathVariable("classFlag") int classFlag){
            return wsCommonSheetService.findType(typeName,classFlag,cloudUser);
    }

    /**
     * 工作单新增
     *
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @param wsCommonSheetVO 工作单提交数据
     * @return  ResultVO 返回信息
     */
    @PostMapping("/insertEntity/{classFlag}")
    public ResultVO insertEntity(
            @PathVariable("classFlag") int classFlag,
            @RequestBody WsCommonSheetVO wsCommonSheetVO){
        try {
            wsCommonSheetService.insertEntity(classFlag,wsCommonSheetVO,cloudUser);
            return new ResultVO(true,"添加"+ StringUtil.castClassName(classFlag)+"成功!");
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultVO(false,"添加"+ StringUtil.castClassName(classFlag)+"失败!");
        }
    }

    /**
     * 获取工作单类型名称下拉,逗号分隔，字符串拼接
     *
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @param cloudUser 用户登录人员信息
     * @return  ResultVO 返回信息
     */
    @GetMapping("/findTypeNamesByClass/{classFlag}")
    public ResultVO findTypeNamesByClass(@PathVariable("classFlag") int classFlag){
        try {
            return new ResultVO(true,wsCommonSheetService.findTypeNamesByClass(classFlag,cloudUser));
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultVO(false,"获取下拉数据异常!");
        }
    }

    /**
     * 工作单单一查询
     *
     * @param cmId 工作单主键
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @return  WsCommonSheetVO 通用工作单VO
     */
    @GetMapping("findWorkSheetById/{cmId}/{classFlag}")
    public WsCommonSheetVO findWorkSheetById(
            @PathVariable("cmId") BigInteger cmId,
            @PathVariable("classFlag") int  classFlag){
        return wsCommonSheetService.findWorkSheetById(cmId,classFlag,cloudUser);
    }

    /**
     * 工作单编辑提交
     *
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @param wsCommonSheetVO 数据实体
     * @return ResultVO 返回信息
     */
    @PostMapping("/updateEntity/{classFlag}")
    public ResultVO updateEntity(
            @PathVariable("classFlag") int classFlag,
            @RequestBody WsCommonSheetVO wsCommonSheetVO){
            try {
                wsCommonSheetService.updateEntity(wsCommonSheetVO,classFlag,cloudUser);
                return new ResultVO(true,"编辑"+StringUtil.castClassName(classFlag)+"成功!");
            } catch (Exception e) {
                e.printStackTrace();
                return new ResultVO(false,"编辑"+StringUtil.castClassName(classFlag)+"失败!");
            }
    }

    /**
     * 工作单删除
     *
     * @param cmId 工作单主键
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @return ResultVO 返回信息
     */
    @DeleteMapping("/deleteEntity/{cmId}/{classFlag}")
    public ResultVO deleteEntity(
            @PathVariable("cmId") BigInteger cmId,
            @PathVariable("classFlag") int classFlag){
            try {
                wsCommonSheetService.deleteEntity(cmId,classFlag);
                return new ResultVO(true,"删除"+StringUtil.castClassName(classFlag)+"成功!");
            } catch (Exception e) {
                e.printStackTrace();
                return new ResultVO(false,"删除"+StringUtil.castClassName(classFlag)+"失败!");
            }
    }

    /**
     * 关联变更单数据新增
     *
     * @param cmId 工作单ID
     * @param wsCommonRelationSheetDTOList 关联变更单集合
     * @return ResultVO 返回信息
     */
    @PostMapping("/saveRelatedSheet/{cmId}")
    public ResultVO saveRelatedSheet(@PathVariable("cmId") BigInteger cmId,
                                     @RequestBody List<WsCommonRelationSheetDTO> wsCommonRelationSheetDTOList){
        try {
            wsCommonSheetService.saveRelatedSheet(cmId,wsCommonRelationSheetDTOList,cloudUser);
            return new ResultVO(true,"添加关联变更单成功!");
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultVO(true,"添加关联变更单失败!");
        }
    }

    /**
     * 关联变更单数据查询
     *
     * @parm cmId 变更单主键ID
     * @return List<WsCommonRelationSheetVO> 关联变更单数据集合
     */
    @GetMapping("/findRelatedSheet/{cmId}")
    public List<WsCommonRelationSheetVO> findRelatedSheet(@PathVariable("cmId") BigInteger cmId){
            return wsCommonSheetService.findRelatedSheet(cmId,cloudUser);
    }


    /**
     * 工作单编号同账套唯一校验
     *
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @param wsCode 工作单编号
     * @return  ResultVO 返回信息
     */
    @GetMapping("/checkWsCode/{wsCode}/{classFlag}")
    public ResultVO checkWsCode(
            @PathVariable("wsCode") String wsCode,
            @PathVariable("classFlag") int classFlag){
        int rows = wsCommonSheetService.checkWsCode(wsCode,classFlag,cloudUser);
        if(rows == 0){
            return new ResultVO(true, "isOK!");
        }else{
            return new ResultVO(false, "后台存在类别:"+StringUtil.castClassName(classFlag)+",编号："+wsCode+"的数据，请修改!");
        }
    }

    /**
     * 流程提交，检验是否绑定流程模型ID
     * @param cmId 工作单ID
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @return ResultVO 返回信息
     */
    @GetMapping("/checkBindFlowId/{cmId}/{classFlag}")
    public ResultVO checkBindFlowId(
                                    @PathVariable("cmId") BigInteger cmId,
                                    @PathVariable("classFlag") int classFlag){
        try {
            String workFlowID = wsCommonSheetService.selectFlowIdByWsId(cmId,classFlag);
            if(workFlowID != null && !"".equals(workFlowID)){
                return new ResultVO(true,"isOk");
            }else{
                return new ResultVO(false,"该笔数据尚未绑定流程模板,请前往变更单类型进行修改!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultVO(false,"检验是否绑定流程模型ID功能异常,请联系管理员!");
        }
    }

    /**
     * 工作单提交 TODO 插入工作单 ； 发起流程
     *
     * @param classFlag 类别 0-问题报告单 1-变更申请单 2-变更通知单 3-作废通知单
     * @param cmId 变更单ID
     * @return  ResultVO 返回信息
     */
    @GetMapping("/flowSubmit/{cmId}/{classFlag}")
    public ResultVO flowSubmit(
            @PathVariable("cmId") BigInteger cmId,
            @PathVariable("classFlag") int classFlag){
        try {
            ProcessParams processParams = new ProcessParams();
            //设置业务数据主键
            processParams.setDvDvId(cmId + StringUtil.castSuffixName(classFlag));
            //设置流程ID
            processParams.setDcWorkFlowId(wsCommonSheetService.selectFlowIdByWsId(cmId,classFlag));
            //设置流程发起人
            processParams.setSubmitDocumentPerson(cloudUser.getId().toString());
            Flag flag = remoteActService.submitDocument(processParams);
            //是否启动成功
            if(flag != null){
                if(flag.getIsSubmitSucceed()){
                    log.info("工作单ID["+processParams.getDvDvId()+"]提交成功,流程已启动");
                    //获取工作单
                    WsCommonSheetVO wsCommonSheetVO =  wsCommonSheetService.findWorkSheetById(cmId,classFlag,cloudUser);
                    wsCommonSheetVO.setCmStatus("1");
                    wsCommonSheetService.updateEntity(wsCommonSheetVO,classFlag,cloudUser);
                }
            }
            return new ResultVO(true,"提交"+ StringUtil.castClassName(classFlag)+"成功!");
        } catch (Exception e) {
            e.printStackTrace();
            return new ResultVO(false,"提交"+ StringUtil.castClassName(classFlag)+"失败!");
        }
    }

    /**
     * 查询工作单编辑权限
     *
     * @param cmId 工作单主键
     * @return String 权限码
     */
    @GetMapping("/findAuthorityId/{cmId}/{classFlag}")
    public String findAuthorityId(@PathVariable("cmId") BigInteger cmId,
                                  @PathVariable("classFlag") int classFlag){
            WsCommonSheetVO wsCommonSheetVO =  findWorkSheetById(cmId,classFlag);
            WsCommonSheet wsCommonSheet = BeanConverter.copyProperties(wsCommonSheetVO,WsCommonSheet.class);
            wsCommonSheet.setCmWsClassFlag(String.valueOf(classFlag));
            return remoteDocService.feignWorkFormPermissions(wsCommonSheet);
    }
}
